<?php
declare (strict_types=1);

namespace app\course\model\base\admin;

use app\common\model\BaseModel;
use app\course\logic\base\CourseCert;
use app\course\model\base\StudentCourseNotify;
use app\user\model\user\admin\Account;

/**
 * 定义课程学员数据模型
 */
class CourseStudent extends BaseModel
{
    /**
     * 表名
     *
     * @var string
     */
    protected $name = 'course_student';
    /**
     * 时间显示格式
     *
     * @var string
     */
    protected $dateFormat = 'Y-m-d H:i';

    /**
     * 设置自动写入时间
     *
     * @var boolean
     */
    protected $autoWriteTimestamp = true;

    /**
     * 不需要更新时间
     *
     * @var boolean
     */
    protected $updateTime = false;

    /**
     * 填充字段
     *
     * @var array
     */
    protected $append = ['from_text'];

    /**
     * 定义字段类型
     *
     * @var array
     */
    protected $type = [
        'id'          => 'integer',
        'user_id'     => 'integer',
        'course_id'   => 'integer',
        'from'        => 'integer',
        'expire_time' => 'timestamp'
    ];

    /**
     * 获取来源文字信息
     * Author   Martinsun<syh@sunyonghong.com>
     * Date 2020-06-30
     *
     * @param string $value [description]
     * @param    [type]                         $data  [description]
     * @return   [type]                                [description]
     */
    public function getFromTextAttr($value = '', $data): string
    {
        $text = [
            1 => '后台添加',
            2 => '学员购买',
            3 => '会员购买',
            4 => '免费课程加入',
            5 => '会员免费课程加入',
            6 => '课程卡兑换',
        ];

        return $text[$data['from']] ?? '未知';
    }

// 模型事件

    /**
     * 新增数据事件
     * Author   Martinsun<syh@sunyonghong.com>
     * Date 2020-03-14
     *
     * @return   string
     */
    public static function onBeforeInsert($student)
    {
        // 来源
        $student->from = 1;
    }

    /**
     * 成功创建之后
     * Author 亓官雨树<lucky.max@foxmail.com>
     * Date：   2021-10-11
     */
    public static function onAfterInsert($stu)
    {
        // 添加待通知记录
        StudentCourseNotify::create(['course_id' => $stu->course_id, 'user_id' => $stu->user_id]);
        // 检查是否发放证书
        app(CourseCert::class)->addCert($stu->course_id, $stu->user_id);
    }

// 关联

    /**
     * 关联用户
     * Author   Martinsun<syh@sunyonghong.com>
     * Date 2020-06-30
     *
     * @return   [type]                         [description]
     */
    public function user()
    {
        return $this
            ->belongsTo(Account::class, 'user_id')
            ->with(['avatar_url'])
            ->removeOption('soft_delete')
            ->removeWhereField('mhm_id');
    }

    /**
     * 关联课程名
     * Author   Martinsun<syh@sunyonghong.com>
     * Date 2020-07-31
     *
     * @return   [type]                         [description]
     */
    public function course()
    {
        return $this->belongsTo(Course::class, 'course_id')->bind(['title', 'course_type', 'course_live_type'])->removeOption('soft_delete');
    }

}
